Skip to content

feat(vacancies): архив и защита истории откликов - #811

Merged
TThanos3000 merged 2 commits into
devfrom
feat/dev-vacancy-archive-lifecycle-20261021
Oct 21, 2026
Merged

TThanos3000 merged 2 commits into
devfrom
feat/dev-vacancy-archive-lifecycle-20261021

Conversation

@TThanos3000

@TThanos3000 TThanos3000 commented Oct 21, 2026 •

Copy link
Copy Markdown
Collaborator

Что изменено

Закрытие вакансии через PATCH завершает только ожидающие отклики и сохраняет историю. DELETE с любыми откликами запрещен, возврат в активные доступен только опубликованному публичному проекту. Повторная публикация проекта оставляет архив закрытым до ручного возврата.

Зачем

Управление вакансиями получает разделы «Активные / Архивные». История кандидатов должна сохраняться, а отказ удаления и последствия закрытия должны объясняться в интерфейсе.

Реализация

Атомарные обновление/удаление с блокировками Project → Vacancy → VacancyResponse и повторной проверкой владельца. Email ожидающим откликам ставятся после commit; повторное закрытие не дублирует уведомления. Invalid skills не удаляют старые навыки и не меняют статус. PUT без is_active не завершает отклики.

Внутренний resume_on_publish отличает архив от временного скрытия вместе с черновиком. Только такие скрытые вакансии и новые вакансии черновика публикуются вместе с проектом. Ручное закрытие и принятие кандидата отменяют автоматическое возобновление. Создание вакансии блокирует Project для согласованности с одновременной публикацией.

API

Существующие PATCH/DELETE /vacancies/{id}/. Добавлено readonly total_response_count; response_count сохраняет семантику ожидающих откликов. DELETE с историей возвращает 400 с code=vacancy_has_responses и detail. Закрытые вакансии в представлении проекта видит менеджер. resume_on_publish в контракт не входит.

UI

Связанный Angular PR #475, внедряется после API. Дизайн в Figma, вкладки согласованы высотой 27 px.

Permissions

Изменения разрешены руководителю проекта и администрации. Серверная проверка повторяется под блокировкой, права из наличия кнопки не выводятся.

Проверки

  • PostgreSQL 18.1, Python 3.11.15 / Django 4.2.11: manage.py test vacancy.tests projects.tests.test_project_signals projects.tests.test_program_project_detail_access --noinput --keepdb — 119 tests passed.
  • Models check, makemigrations --check --dry-run — exit 0; upgrade migration 0011 на старых активных/закрытых записях проверен тестом.
  • Black измененных Python-файлов; Flake8 новых lifecycle/test файлов; git diff --check.
  • Backend PostgreSQL CI на финальном runtime SHA c92d997: пустая PostgreSQL 15, миграции, 39 locking/response tests и полный suite — 1296 tests, OK.
  • CI Tests и Lint — success на том же SHA.
  • Дополнительный локальный полный прогон с --keepdb: 1296 tests, 1 error в users.test_university_import из-за отсутствия исходного справочника в сохраненной базе после предыдущих TransactionTestCase. Этот неизмененный тест отдельно прошел на новой изолированной PostgreSQL (1 test, OK); полный CI на чистой базе — 1296 tests, OK. Локальный полный прогон не заявляется успешным.

Acceptance criteria

  • Закрытие сохраняет историю и уведомляет только ожидающих; повтор идемпотентен.
  • Возврат сохраняет прежние решения; draft/private проект получает отказ.
  • Любое состояние отклика запрещает прямое удаление, включая архив; чужой пользователь получает отказ.
  • Ошибочный запрос не закрывает вакансию и не удаляет навыки; счетчики сохраняют совместимость и число SQL-запросов.
  • Повторная публикация сохраняет архив и дату закрытия до ручного возврата; новые вакансии черновика публикуются. Решение пользователя от 21.10.2026 подтверждено API/signal tests.

Не проверено

Deployed dev и реальная доставка email.

Риски / migration

API + миграция vacancy.0011_vacancy_resume_on_publish внедряются до Angular #475. Additive BooleanField default=false: статусы/даты старых записей не переписываются; все старые закрытые вакансии, включая старые черновики, остаются в архиве до ручного возврата. Причина их прежнего закрытия не сохранялась, поэтому автоматическое возобновление для них не предполагается. Миграция обязательна до запуска нового кода. Подробности и evidence: docs/vacancy-archive-api.md. Merge/deploy выполняет пользователь.

@TThanos3000
TThanos3000 marked this pull request as ready for review October 21, 2026 12:28
@TThanos3000
TThanos3000 merged commit 51d947b into dev Oct 21, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants